<?php
App::uses('AppModel', 'Model');
/**
 * DataPagamento Model
 *
 * @property Especializacao $Especializacao
 * @property Associacao $Associacao
 */
class DataPagamento extends AppModel {

/**
 * Display field
 *
 * @var string
 */
	public $displayField = 'id';

/**
 * Validation rules
 *
 * @var array
 */
	public $validate = array(
		'data_inicio' => array(
			'text' => array(
				'rule' => array('notempty'),
				'message' => 'Selecione uma data inicial',
				//'allowEmpty' => false,
				'required' => true,
				//'last' => false, // Stop validation after this rule
				'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
		),
		'data_fim' => array(
			'text' => array(
				'rule' => array('notempty'),
				'message' => 'Selecione uma data final',
				//'allowEmpty' => false,
				'required' => true,
				//'last' => false, // Stop validation after this rule
				'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
		),
		'especializacao_id' => array(
			'numeric' => array(
				'rule' => array('numeric'),
				//'message' => 'Your custom message here',
				//'allowEmpty' => false,
				//'required' => false,
				//'last' => false, // Stop validation after this rule
				//'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
		),
		'associacao_id' => array(
			'numeric' => array(
				'rule' => array('numeric'),
				//'message' => 'Your custom message here',
				//'allowEmpty' => false,
				//'required' => false,
				//'last' => false, // Stop validation after this rule
				//'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
		),
		'preco' => array(
			'decimal' => array(
				'rule' => array('decimal'),
				//'message' => 'Your custom message here',
				//'allowEmpty' => false,
				//'required' => false,
				//'last' => false, // Stop validation after this rule
				//'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
		),
	);

	//The Associations below have been created with all possible keys, those that are not needed can be removed

/**
 * belongsTo associations
 *
 * @var array
 */
	public $belongsTo = array(
		'Especializacao' => array(
			'className' => 'Especializacao',
			'foreignKey' => 'especializacao_id',
			'conditions' => '',
			'fields' => '',
			'order' => ''
		),
		'Associacao' => array(
			'className' => 'Associacao',
			'foreignKey' => 'associacao_id',
			'conditions' => '',
			'fields' => '',
			'order' => ''
		)
	);
	
	/**
	 * Retorna um array pra ler na tabela de preços
	 * @return array da forma Associacao > Especializacao > preco
	 */
	public function tabelaDePrecos(){
		$dados = $this->find('all', array('recursive'=>-1, 'order'=>'data_inicio ASC'));
		$array = array();
		//pr($dados);
		foreach($dados as $item){
			$array[$item['DataPagamento']['data_inicio']][$item['DataPagamento']['data_fim']][$item['DataPagamento']['associacao_id']][$item['DataPagamento']['especializacao_id']] = array('preco'=>$item['DataPagamento']['preco'], 'id'=>$item['DataPagamento']['id']);
		}
		return $array;
	}
	
	public function redirecionar(){
		return !$this->find('first');
	}
	
	public function validarIntervalo($dataPagamento){
		$query = array(
					'conditions'=>array(
							'OR'=>array(
									array('data_fim BETWEEN ? AND ?' => array(
											$dataPagamento['DataPagamento']['data_inicio'],
											$dataPagamento['DataPagamento']['data_fim'])),
									array('data_inicio BETWEEN ? AND ?' => array( 
											$dataPagamento['DataPagamento']['data_inicio'],
											$dataPagamento['DataPagamento']['data_fim'])),
									array(
											'data_fim >=' => $dataPagamento['DataPagamento']['data_fim'],
											'data_inicio <=' =>	$dataPagamento['DataPagamento']['data_inicio']))));
		
		return !$this->find('first', $query);
	}
	
	public function savePeriodo($data){
			$sp = ClassRegistry::init('Especializacao');
			$as = ClassRegistry::init('Associacao');
			
			if(isset($data['Associacao'])){
				$as->save($data['Associacao']);
			}
			
			if(isset($data['Especializacao'])){
				$sp->save($data['Especializacao']);
			}
			
			$spec = $sp->find('list', array('fields' => 'id'));
			$ass = $as->find('list', array('fields' => 'id'));
			
			foreach($spec as $s){
				foreach($ass as $a){
					$entrada[] = array('data_inicio' => $data['DataPagamento']['data_inicio'],
							'data_fim' => $data['DataPagamento']['data_fim'],
							'especializacao_id' => $s,
							'associacao_id' => $a,
							'preco' => -1.00);
				}
			}
			return $this->saveAll($entrada);
	}
	
	
	public function deletePeriodo($data){
		return $this->deleteAll(array('data_fim =' => $data['data_fim'],
								   	  'data_inicio =' => $data['data_inicio']), false);
	}
	
	public function adicionarEspAss($id,$modelo){
		$spec = null;
		$model_ids = null;
		if($modelo === "associacao"){
			$spec = ClassRegistry::init('Especializacao');
			$model_ids = $spec->find('list', array('fields' => 'id'));
		}
		elseif($modelo === "especializacao"){
			$spec = ClassRegistry::init('Associacao');
			$model_ids = $spec->find('list', array('fields' => 'id'));
		}
		else 
			throw new Exception();
		
		$dates = $this->find('all', array('fields' => array('data_inicio', 'data_fim'), 'group' => 'data_fim'));
		$entrada = array();
		
		foreach($dates as $date){
			if($modelo === "associacao"){
				foreach($model_ids as $model_id){
					$entrada[] = array('data_inicio' => $date['DataPagamento']['data_inicio'], 
									   'data_fim' => $date['DataPagamento']['data_fim'], 
									   'especializacao_id' => $model_id,
									   'associacao_id' => $id,
									   'preco' => -1.00);	
				}
			}
			elseif($modelo === "especializacao"){
				foreach($model_ids as $model_id){
					$entrada[] = array('data_inicio' => $date['DataPagamento']['data_inicio'],
							'data_fim' => $date['DataPagamento']['data_fim'],
							'especializacao_id' => $id,
							'associacao_id' => $model_id,
							'preco' => -1.00);
				}
			}
		}
		// TODO Retornar o resultado
		$this->saveAll($entrada);
	
	}
	
	public function buscaPreco($especializacao, $associacao, $data=null){
		if(is_null($data))
			$data = date('Y-m-d');
		$preco = $this->find('first', array('conditions'=>array('especializacao_id'=>$especializacao, 'associacao_id'=>$associacao, 'data_inicio <='=>$data, 'data_fim >='=>$data), 'recursive'=>-1));
		if(isset($preco['DataPagamento']['preco'])){
			return $preco['DataPagamento']['preco'];
		}
		else {return -1;}
	}
}
